package org.dromara.tearoom.util;

import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.client.HttpClientErrorException;
public class JSONNUtil {

    /**
     * 将ResponseEntity的响应体转换为指定类型的实体对象，不检查HTTP状态码。
     *
     * @param <T>        目标实体类型
     * @param response   ResponseEntity对象
     * @param entityType 目标实体类类型
     * @return 转换后的实体对象
     * @throws IllegalArgumentException 如果响应体为空
     * @throws ClassCastException       如果响应体类型与目标类型不匹配
     */
    public static <T> T toEntity(ResponseEntity<?> response, Class<T> entityType) {
        return doConvert(response, entityType, false);
    }

    /**
     * 将ResponseEntity的响应体转换为指定类型的实体对象，并检查HTTP状态码是否为成功（2xx）。
     *
     * @param <T>        目标实体类型
     * @param response   ResponseEntity对象
     * @param entityType 目标实体类类型
     * @return 转换后的实体对象
     * @throws HttpClientErrorException 如果HTTP状态码不是2xx
     * @throws IllegalArgumentException 如果响应体为空
     * @throws ClassCastException       如果响应体类型与目标类型不匹配
     */
    public static <T> T toEntityWithStatusCheck(ResponseEntity<?> response, Class<T> entityType) {
        return doConvert(response, entityType, true);
    }

    private static <T> T doConvert(ResponseEntity<?> response, Class<T> entityType, boolean checkStatus) {
        // 1. 检查HTTP状态码（可选）
        if (checkStatus && !isSuccess((HttpStatus) response.getStatusCode())) {
            throw new HttpClientErrorException(response.getStatusCode());
        }

        // 2. 获取响应体
        Object body = response.getBody();
        if (body == null) {
            throw new IllegalArgumentException("Response body is null");
        }



        return entityType.cast(body);
    }

    /**
     * 判断HTTP状态码是否为成功（2xx）
     *
     * @param status HTTP状态码
     * @return true表示成功状态码，false表示其他状态码
     */
    private static boolean isSuccess(HttpStatus status) {
        return status != null && status.series() == HttpStatus.Series.SUCCESSFUL;
    }
}

